package com.bjpowernode.pay.model.dto;

import com.bjpowernode.common.pay.PayUtil;
import com.bjpowernode.common.pay.Pkipair;
import lombok.Data;

import java.math.BigDecimal;


@Data
public class KuaiQianFormDTO {

    //人民币网关账号，该账号为11位人民币网关商户编号+01,该参数必填。
    String merchantAcctId = "1001214035601";//
    //编码方式，1代表 UTF-8; 2 代表 GBK; 3代表 GB2312 默认为1,该参数必填。
    String inputCharset = "1";
    //接收支付结果的页面地址，该参数一般置为空即可。
    String pageUrl = "";
    //服务器接收支付结果的后台地址，该参数务必填写，不能为空。
    String bgUrl = "http://localhost:8000/ylb/pay/kuaiqian/notice";
    //网关版本，固定值：v2.0,该参数必填。
    String version =  "v2.0";
    //语言种类，1代表中文显示，2代表英文显示。默认为1,该参数必填。
    String language =  "1";
    //签名类型,该值为4，代表PKI加密方式,该参数必填。
    String signType =  "4";
    //支付人姓名,可以为空。
    String payerName= "";
    //支付人联系类型，1 代表电子邮件方式；2 代表手机联系方式。可以为空。
    String payerContactType =  "2";
    //支付人联系方式，与payerContactType设置对应，payerContactType为1，则填写邮箱地址；payerContactType为2，则填写手机号码。可以为空。
    String payerContact =  "";
    //指定付款人，可以为空
    String payerIdType =  "3";
    //付款人标识，可以为空
    String payerId =  "";
    //付款人IP，可以为空
    String payerIP =  "192.168.1.1";
    //商家的终端ip，支持Ipv4和Ipv6
    String terminalIp =  "192.168.1.1";
    //网络交易平台简称，英文或中文字符串,除微信支付宝支付外其他交易方式必传
    String tdpformName =  "盈利宝平台";
    //商户订单号，以下采用时间来定义订单号，商户可以根据自己订单号的定义规则来定义该值，不能为空。
    String orderId = "";
    //订单金额，金额以“分”为单位，商户测试以1分测试即可，切勿以大金额测试。该参数必填。
    String orderAmount = "";
    //订单提交时间，格式：yyyyMMddHHmmss，如：20071117020101，不能为空。
    String orderTime =  "";
    //快钱时间戳，格式：yyyyMMddHHmmss，如：20071117020101， 可以为空
    String orderTimestamp= "";
    //商品名称，不可为空。
    String productName= "金币";
    //商品数量，不可为空。
    String productNum = "1";
    //商品代码，可以为空。
    String productId = "10000";
    //商品描述，可以为空。
    String productDesc = "盈利宝充值";
    //扩展字段1，商户可以传递自己需要的参数，支付完快钱会原值返回，可以为空。
    String ext1 = "";
    //扩展自段2，商户可以传递自己需要的参数，支付完快钱会原值返回，可以为空。
    String ext2 = "";
    //支付方式，一般为00，代表所有的支付方式。如果是银行直连商户，该值为10-1或10-2，必填。
    String payType = "00";
    //银行代码，如果payType为00，该值可以为空；如果payType为10-1或10-2，该值必须填写，具体请参考银行列表。
    String bankId = "";
    //同一订单禁止重复提交标志，实物购物车填1，虚拟产品用0。1代表只能提交一次，0代表在支付不成功情况下可以再提交。可为空。
    String redoFlag = "0";
    //快钱合作伙伴的帐户号，即商户编号，可为空。
    String pid = "";
    //00:代表前台提交01：代表后台提交，为空默认为前台提交。
    String submitType = "";
    //订单超时时间(秒)，可为空。
    String orderTimeOut = "";

    //附加信息类型	固定值为NB2（分账时使用）
    String extDataType = "";
    //附加信息（分账时使用）
    String extDataContent = "";
    //签名字符串
    String signMsg = "";

    //分期数
    String  period = "";

    public KuaiQianFormDTO(Integer uid, String phone,  String token, String rechargeNo, BigDecimal payMoney) {
        this.payerContact = phone; //支付人联系方式
        this.payerId = String.valueOf(uid);//支付人在盈利宝的userId
        this.orderId = rechargeNo;
        this.orderAmount = payMoney.multiply(new BigDecimal("100")).stripTrailingZeros().toPlainString()  ;//支付金额，分为单位
        this.orderTime = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(new java.util.Date());
        this.orderTimestamp = orderTime;
        this.ext1 = String.valueOf(uid);
        this.ext2=  token;
        //创建signMsg
        this.signMsg = buidlerSign();
    }

    private String buidlerSign() {

        // signMsg 签名字符串 不可空，生成加密签名串
        String signMsgVal = "";
        signMsgVal = PayUtil.appendParam(signMsgVal, "inputCharset", inputCharset);
        signMsgVal = PayUtil.appendParam(signMsgVal, "pageUrl", pageUrl);
        signMsgVal = PayUtil.appendParam(signMsgVal, "bgUrl", bgUrl);
        signMsgVal = PayUtil.appendParam(signMsgVal, "version", version);
        signMsgVal = PayUtil.appendParam(signMsgVal, "language", language);
        signMsgVal = PayUtil.appendParam(signMsgVal, "signType", signType);
        signMsgVal = PayUtil.appendParam(signMsgVal, "merchantAcctId",merchantAcctId);
        signMsgVal = PayUtil.appendParam(signMsgVal, "payerName", payerName);
        signMsgVal = PayUtil.appendParam(signMsgVal, "payerContactType",payerContactType);
        signMsgVal = PayUtil.appendParam(signMsgVal, "payerContact", payerContact);
        signMsgVal = PayUtil.appendParam(signMsgVal, "payerIdType", payerIdType);
        signMsgVal = PayUtil.appendParam(signMsgVal, "payerId", payerId);
        signMsgVal = PayUtil.appendParam(signMsgVal, "payerIP", payerIP);
        signMsgVal = PayUtil.appendParam(signMsgVal, "orderId", orderId);
        signMsgVal = PayUtil.appendParam(signMsgVal, "orderAmount", orderAmount);
        signMsgVal = PayUtil.appendParam(signMsgVal, "orderTime", orderTime);
        signMsgVal = PayUtil.appendParam(signMsgVal, "orderTimestamp", orderTimestamp);
        signMsgVal = PayUtil.appendParam(signMsgVal, "productName", productName);
        signMsgVal = PayUtil.appendParam(signMsgVal, "productNum", productNum);
        signMsgVal = PayUtil.appendParam(signMsgVal, "productId", productId);
        signMsgVal = PayUtil.appendParam(signMsgVal, "productDesc", productDesc);
        signMsgVal = PayUtil.appendParam(signMsgVal, "ext1", ext1);
        signMsgVal = PayUtil.appendParam(signMsgVal, "ext2", ext2);
        signMsgVal = PayUtil.appendParam(signMsgVal, "payType", payType);
        signMsgVal = PayUtil.appendParam(signMsgVal, "bankId", bankId);
        signMsgVal = PayUtil.appendParam(signMsgVal, "redoFlag", redoFlag);
        signMsgVal = PayUtil.appendParam(signMsgVal, "pid", pid);
        signMsgVal = PayUtil.appendParam(signMsgVal, "submitType", submitType);
        signMsgVal = PayUtil.appendParam(signMsgVal, "orderTimeOut", orderTimeOut);
        signMsgVal = PayUtil.appendParam(signMsgVal, "period", period);
        signMsgVal = PayUtil.appendParam(signMsgVal, "extDataType", extDataType);
        signMsgVal = PayUtil.appendParam(signMsgVal, "extDataContent", extDataContent);

        Pkipair pki = new Pkipair();
        String signMsg = pki.signMsg(signMsgVal);

        return signMsg;
    }
}
